Ubuntu和WSL学习
概述
因为之前那篇 Linux 的文章内容已经涉及到太多内容了(且杂)所以有关 Ubuntu 相关的笔记丢到这里
这里主要是使用 WSL 因为通过 VM 开启一个 Linux 虚拟机实在太慢了(且不流畅),不如这个原生子系统的支持那么好,所以这篇也算是记录 WSL 上的坑
WSL 最令人迷惑的就是那个根目录
WSL1 的根目录
C:\Users\alsritter\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs
WSL2 的根目录(比较神奇的是这是个网络路径)
\\wsl$\Ubuntu-18.04
注意:不过官方不建议直接通过资源管理器修改文件 参考官方 Do not change Linux files using Windows apps and tools
Ubuntu 桌面版和服务器版的区别
Ubuntu 桌面版(Ubuntu Desktop)和服务器版(Ubuntu Server)区别就是桌面版带 gui,服务器版本不带
使用 WSL 和 vscode 配合使用,需要使用管理员打开终端
终端到自己想要编辑的目录下输入 code .
就会自动打开 vscode (第一次安装那个插件需要重启,否则打不开...)
且目录也需要使用有权限
使用 XShell 连接 WSL
要先重装 ssh
sudo apt-get remove openssh-server
sudo apt-get install openssh-server
因为默认的 ssh 的是 22 端口,而 Windows 的 22 端口被占用了,所以需要手动更改下端口
sudo vim /etc/ssh/sshd_config
改下配置文件
Port 2222 #默认的是22,但是windows有自己的ssh服务,也是监听的22端口,所以这里要改一下
UsePrivilegeSeparation no
PasswordAuthentication yes
PermitRootLogin yes # 允许 root 登陆
AllowUsers youusername # 这里改成你登陆WSL用的
启动 ssh server(但是必须保持这个终端打开,关掉了就无法连接了)
sudo service ssh --full-restart
设置中文环境
执行区域设置重新配置本地化
sudo dpkg-reconfigure locales
选择 zh_CN.UTF-8
配置好之后关掉 shell 再重新打开
# 打印当前的环境
echo $LANG
更新为 wsl2
查看当前的 wsl 版本
wsl -l -v
#===============
NAME STATE VERSION
* Ubuntu-18.04 Stopped 1
#================
# 启用虚拟机平台可选组件
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
# 切换 Ubuntu-18.04 为 wsl2
wsl --set-version Ubuntu-18.04 2
# 使得之后安装的 Linux 子系统都安装到 WSL2 中
wsl --set-default-version 2
WSL2 占用内存问题
参考资料 解决WSL2中Vmmem内存占用过大问题教程 参考资料 官方用法 参考资料 wsl 内存泄漏 bug issue
按下Windows + R
键,输入 %UserProfile%
并运行进入用户文件夹
新建文件 .wslconfig
[wsl2]
memory=2GB
swap=0
localhostForwarding=true
然后打开 powershell,输入 wsl --shutdown
来关闭当前的子系统,然后会弹框提醒重启 wsl
snapd 包管理器
安装
apt-get install snapd
如果是 Wsl2
$ sudo apt-get update \
&& sudo apt-get install -yqq daemonize dbus-user-session fontconfig
snapd 和 apt/apt-get 的区别?
snap 和 apt 都是包管理系统,apt 被设计用于Debian发行版,比如 Ubuntu,而 snap 是通用的,用于各种 Linux发行版。apt 只是将包的内容安装在包说明中指定的位置,以这种方式安装的软件需要系统或第三方库,而 snap 是自包含的,在沙盒中运行,不直接与主机系统相关。
WSL 代理
如果使用 Clash for Windows 则更方便
export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"
测试:
sudo apt install w3m
w3m www.google.com
如果是 ip 地址需要加上完整的协议头
w3m http://10.10.10.10:8080
Wsl2 的初始化系统
因为 Wsl2 使用不是 systemd,所以应该使用 service 来检查
检查当前的服务
$ service --status-all
[ - ] apparmor
[ ? ] apport
[ + ] atd
[ - ] console-setup.sh
[ + ] cron
...
- [+] 代表服务是在启动运行的状态
- [-] 代表服务是在关闭停止的状态systemctl 命令
- [?] 这个状态标识服务在初始化或者启动时没有输出有效的状态
使用 service 启动一个服务
$ service nginx start
可以理解成 service 就是 init.d 的一种实现方式。 所以这两者启动方式(或者是停止、重启)并没有什么区别。
$ sudo /etc/init.d/nginx start
# 等价于
$ service nginx start
但是这两种方式均有如下缺点:
- 启动时间长:init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 启动脚本复杂:init 进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长。
使用 systemd
使用这个 脚本
mkdir caches && cd caches
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh
随后重启 WSL
wsl --shutdown
然后打开 WSL,尝试 systemctl:
systemctl